package com.atguigu.gmall.file;

import java.util.concurrent.*;

/**
 * @author ：MJS
 * @date ：Created in 2021/5/14  21:16
 * @description：TODO
 *   异步编排
 *       多线程  核心实现类   多线程复杂交互
 */

public class CompletableFutureDemo1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    /*    //1.创建多线程  异步  无返回值
        CompletableFuture.runAsync(()->{
            System.out.println(Thread.currentThread().getName()+"\t"+"insert in");
        });*/
      /*  //2.创建多线程   异步  有返回值
        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "insert in");
            return "hha";
        });
        System.out.println(stringCompletableFuture.get());
        System.out.println(Thread.currentThread().getName()+"\t"+"insert in");*/
/*        CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "insert in");//第一个任务
            int i=1/0;
            return 123;
        }).whenComplete((t,u)->{//继续沿用上一个任务的线程
            //whenComplete  作用：第二个任务
            //第二个任务依赖第一个任务，必须等待第一个任务执行完成
            //第二个任务  是收尾任务
            //t:是第一个任务的返回值
            // u:是第一个任务的异常信息
            System.out.println("t:"+t);
            System.out.println("u"+u);//对多线程出现问题 进行处理  降级处理
        }).whenCompleteAsync((t,u)->{//去线程池获取新的线程
            //whenComplete  作用：第二个任务
            //第二个任务依赖第一个任务，必须等待第一个任务执行完成
            //第二个任务  是收尾任务
            //t:是第一个任务的返回值
            // u:是第一个任务的异常信息
            System.out.println("t:"+t);
            System.out.println("u"+u);//对多线程出现问题 进行处理  降级处理
        }).exceptionally(u->{  //只能处理异常  并将结果返回给下一个
            System.out.println("u"+u);
            return 123456;
        }).whenComplete((t,u)->{

        });*/
        //5、多线程串行
        CompletableFuture<Void> h1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("我是第一个任务，我创造了线程");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "123";
        }).thenApply(t -> {
            System.out.println("thenApply接收上一个任务的返回值t：" + t);
            //同时自己的任务也有返回值
            return 456;
        }).thenAccept(t -> {

            System.out.println("thenAccept接收上一个任务的返回值t:" + t);
            //自己的任务没有返回值
        }).thenRun(() -> {
            //当前任务不接受上一个的返回值  并且自身没有返回值
            System.out.println("我只执行自己的程序");
        });
        //6、多线程并行
        CompletableFuture<String> h2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("我是第二个任务，我创造了线程");
            return "111";
        });
        //等待上边二个线程执行完成
        CompletableFuture.allOf(h1,h2).join();
        System.out.println("我在最后");
    }


}
